package com.bt.lms.ui.page.sys.user.action;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.bt.lms.constants.SysBizTypeConstant;
import com.bt.lms.entity.Role;
import com.bt.lms.entity.page.Page;
import com.bt.lms.network.msg.ReqMsg;
import com.bt.lms.network.msg.RespMsg;
import com.bt.lms.ui.page.sys.ServerInfo;
import com.bt.lms.ui.page.sys.user.PageRelationRole;
import com.bt.lms.ui.page.sys.utils.ArrayUtils;
import com.bt.lms.ui.page.sys.utils.NetWorkUtils;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.List;

/**
 * 添加界面关联按钮事件
 *
 * @author 徐大永
 */
public class UARelationBtnAction implements EventHandler<ActionEvent> {

    /**
     * 角色合集（新增用户列表
     */
    private final List<Role> roleUserList;

    /**
     * 列表容器
     */
    private final VBox roleTableViewVBox;

    /**
     * 构建事件
     *
     * @param roleUserList      角色合集*（新增用户列表）
     * @param roleTableViewVBox 列表容器
     */
    public UARelationBtnAction(List<Role> roleUserList, VBox roleTableViewVBox) {
        this.roleUserList = roleUserList;
        this.roleTableViewVBox = roleTableViewVBox;
    }

    /**
     * 事件实现
     */
    @Override
    public void handle(ActionEvent event) {

        //1.发送网络请求，获取全部角色信息
        Page<Role> rolePage = netReqRole();
        //2.界面显示
        if (rolePage == null) {
            hintFrame();
            return;
        }
        //要显示的界面
        frameInit(rolePage);
        //3.角色界面，确认按钮，拿出所有打勾角色id，重新添进角色合集

    }

    /**
     * 弹框初始化
     *
     * @param rolePage 分页模型
     */
    private void frameInit(Page<Role> rolePage) {

        //界面显示
        Alert alert = new Alert(Alert.AlertType.NONE);
        alert.setHeaderText(null);//自带提示
        alert.setTitle("角色信息");
        PageRelationRole pageRelationRole = new PageRelationRole(rolePage, alert, roleUserList, roleTableViewVBox);
        alert.setGraphic(pageRelationRole);//内容显示
        alert.getDialogPane().setMaxWidth(680);//宽度
        alert.getDialogPane().setMaxHeight(650);////高度
        alert.showAndWait();

    }

    /**
     * 网络请求（角色）
     *
     * @return 分页模型（内含角色信息）
     */
    private Page<Role> netReqRole() {

        //要返回的对象
        Page<Role> rolePage = new Page<>();
        try (Socket socket = new Socket(ServerInfo.IP, ServerInfo.PORT)){
            //1.2 组装请求消息
            ReqMsg reqMsg = assemble(rolePage);
            //1.3 转字节流
            byte[] reqBytes = reqMsg.toBytes();
            //1.4 发送 send
            OutputStream out = socket.getOutputStream();
            out.write(reqBytes);
            //1.5 等待回应
            InputStream in = socket.getInputStream();
            List<byte[]> receiveBytes = NetWorkUtils.receive(in);
            byte[] respBytes = ArrayUtils.joinBytes(receiveBytes);
            //1.6 解析回应
            RespMsg respMsg = RespMsg.toRespMsg(respBytes);
            //资源管理
            in.close();
            out.close();
            //1.7 比较状态
            short status = respMsg.getStatus();
            if (status == RespMsg.NETWORK_STATUS_NORMAL) {
                //1.8 处理数据
                String data = respMsg.getData();

                return JSONObject.parseObject(data, rolePage.getClass());
            } else {
                return null;
            }


        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 组装网络消息
     *
     * @param obj 要发送的对象
     * @return 请求消息
     */
    private ReqMsg assemble(Object obj) {

        //要返回的对象
        ReqMsg reqMsg = new ReqMsg();

        //业务类型
        reqMsg.setBizType(SysBizTypeConstant.ROLE_COR_PAGE_QUERY);
        //请求id
        long reqId = System.currentTimeMillis();
        reqMsg.setReqId(reqId);
        //消息体
        String data = JSON.toJSONString(obj);
        reqMsg.setData(data);

        return reqMsg;
    }

    /**
     * 程序终止
     * 弹窗提示
     */
    private void hintFrame() {

        String hint = "获取内容，请稍候重试或练习客服。";

        //提示弹窗
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        //错误提示
        alert.setTitle("失败");
        alert.setHeaderText(null);
        alert.setContentText(hint);
        alert.showAndWait();
    }

}